/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat;

import pittypat.configuration.PittypatConfig;

import java.time.LocalDateTime;
import java.util.UUID;

/**
 * INotificationService 的默认实现。当配置文件中没有配置 notificationService 时使用的默认通知服务。
 */
public final class NotificationService implements INotificationService {
	// 默认的通知服务
	private static final NotificationService DEFAULT_INSTANCE = new NotificationService();

	// 当前通知服务
	private static INotificationService currentService = null;
	// 同步对通知服务的访问
	private static final Object CURRENT_SERVICE_LOCK = new Object();

	/**
	 * 根据配置文件获取当前通知服务。
	 * 
	 * @return 当前通知服务。
	 * @throws ClassNotFoundException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static INotificationService getCurrent()
			throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		if (currentService == null) {
			synchronized (CURRENT_SERVICE_LOCK) {
				if (currentService == null) {
					String typeName = PittypatConfig.getCurrent().getNotificationService();

					if (typeName == null || typeName.length() == 0) {
						currentService = DEFAULT_INSTANCE;
					} else {
						Class<?> type = Class.forName(typeName);
						if (type == null) {
							throw new ClassNotFoundException("没有找到作为通知服务的类型定义：" + typeName + "。");
						}

						currentService = (INotificationService) type.newInstance();
					}
				}
			}
		}

		return currentService;
	}

	// 初始化 NotificationService 类的新实例。
	private NotificationService() {
	}

	/**
	 * 加载指定用户的新通知的数目。总是返回 0。
	 * 
	 * @param userId
	 *            用户的 Id。
	 * @param progress
	 *            跟踪和汇报异步操作的进度。
	 * @return 目标用户新通知的数目。
	 */
	@Override
	public long count(UUID userId, IAsyncProgress progress) {
		return 0L;
	}

	/**
	 * 加载指定用户的新通知的列表。总是返回空列表。
	 * 
	 * @param userId
	 *            用户的 Id。
	 * @param progress
	 *            跟踪和汇报异步操作的进度。
	 * @return 目标用户新通知的列表。
	 */
	@Override
	public NotificationList list(UUID userId, IAsyncProgress progress) {
		return NotificationList.EMPTY;
	}

	/**
	 * 将指定的通知记录标记为已读。总是返回 null。
	 * 
	 * @param userId
	 *            用户的 Id。
	 * @param notificationId
	 *            要标记为已读的通知记录的 Id。
	 * @param progress
	 *            跟踪和汇报异步操作的进度。
	 * @return 通知被标记的时间。
	 */
	@Override
	public LocalDateTime read(UUID userId, UUID notificationId, IAsyncProgress progress) {
		return null;
	}
}
